package com.yztc.xiami_app.helper.baidumap;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.Poi;

import java.util.List;

import static cn.bmob.v3.Bmob.getApplicationContext;

/**
 * Created by 周旭 on 2016/11/22.
 * "百度地图定位"功能模块
 */

public class MapLocation {

    private Activity activity;
    private ILocationListener listener;

    //百度地图定位
    private LocationClient mLocationClient = null;
    private BDLocationListener mBdLocationListener = null;

    public MapLocation(Activity activity,ILocationListener listener) {
        this.activity = activity;
        this.listener = listener;
    }

    public void requestRuntimePermission() {
        int hasPermission1 = ContextCompat.checkSelfPermission(activity, Manifest
                .permission.ACCESS_COARSE_LOCATION);
        int hasPermission2 = ContextCompat.checkSelfPermission(activity, Manifest
                .permission.ACCESS_FINE_LOCATION);
        int hasPermission3 = ContextCompat.checkSelfPermission(activity, Manifest
                .permission.READ_PHONE_STATE);
        if (hasPermission1 != PackageManager.PERMISSION_GRANTED &&
                hasPermission2 != PackageManager.PERMISSION_GRANTED &&
                hasPermission3 != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(activity, new String[]{
                    Manifest.permission.ACCESS_COARSE_LOCATION,
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.READ_PHONE_STATE}, 1);
        } else {
            //开始定位
             startLocation();
        }

    }

    private void startLocation() {
        //声明LocationClient类
        mLocationClient = new LocationClient(getApplicationContext());

        //定义LoactionClient的配置选项
        initLocation();

        //开始定位
        mLocationClient.start();

        mBdLocationListener = new BDLocationListener() {
            @Override
            public void onReceiveLocation(BDLocation location) {
                if (location != null) {
                    String info = getLoctionInfo(location);
                    String city = location.getCity().replace("市", ""); //城市
                    String address = location.getAddrStr(); //精确的定位结果
                    listener.getCity(city);
                    listener.getAddress(address);
                }
            }
        };

        //注册监听器
        mLocationClient.registerLocationListener(mBdLocationListener);
    }

    private void initLocation() {
        LocationClientOption option = new LocationClientOption();
        //可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选，默认gcj02，设置返回的定位结果坐标系
        option.setCoorType("bd09ll");
        //int span = 1000;
        //option.setScanSpan(span);//可选，默认0，即仅定位一次，设置发起定位请求的间隔需要大于等于1000ms才是有效的
        option.setIsNeedAddress(true);//可选，设置是否需要地址信息，默认不需要
        option.setOpenGps(true);//可选，默认false,设置是否使用gps

        //可选，默认false，设置是否当gps有效时按照1S1次频率输出GPS结果
        option.setLocationNotify(false);
        //可选，默认false，设置是否需要位置语义化结果，可以在BDLocation
        // .getLocationDescribe里得到，结果类似于“在北京天安门附近”
        option.setIsNeedLocationDescribe(true);

        //可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        option.setIsNeedLocationPoiList(true);

        //可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        option.setIgnoreKillProcess(true);

        mLocationClient.setLocOption(option);
    }

    private String getLoctionInfo(BDLocation location) {
        StringBuilder sb = new StringBuilder();
        //sb.append(location.getTime());
        if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果
            sb.append("\n gps定位成功");
            sb.append("\n地址 : ");
            sb.append(location.getAddrStr());
        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果
            sb.append("\n 网络定位成功");
            sb.append("\n");
            sb.append(location.getAddrStr());
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果
            sb.append("\ndescribe : ");
            sb.append("离线定位成功，离线定位结果也是有效的");
        } else if (location.getLocType() == BDLocation.TypeServerError) {
            sb.append("\ndescribe : ");
            sb.append("服务端网络定位失败，可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com，会有人追查原因");
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
            sb.append("\ndescribe : ");
            sb.append("网络不同导致定位失败，请检查网络是否通畅");
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
            sb.append("\ndescribe : ");
            sb.append("无法获取有效定位依据导致定位失败，一般是由于手机的原因，处于飞行模式下一般会造成这种结果，可以试着重启手机");
        }
        sb.append("\n");
        sb.append(location.getLocationDescribe());// 位置语义化信息

        sb.append("\n周边有:");
        List<Poi> list = location.getPoiList();// POI数据
        if (list != null) {
            for (Poi p : list) {
                sb.append("\n");
                sb.append(p.getName());
            }
        }
        return sb.toString();
    }

    //供外部调用者调用的获取精确定位的地址的方法
    public void getAddress(){
        requestRuntimePermission();
    }
}
